
//
//  Graph.swift
//  SwiftyDSA
//
//  Created by Archer on 2018/8/14.
//  Copyright © 2018年 Archer. All rights reserved.
//

import Foundation

/// 图 V -> 顶点数据类型  E -> 边数据类型
public class Graph<V, E> {
    
    /// 顶点
    // 顶点总数
    var n: Int
    //插入顶点，返回编号
    func insert(_ v: V) -> Int {
        debugFatalError("needs to be override")
    }
    //删除顶点及其关联边，返回该顶点信息
    func remove(at index: Int) -> V {
        debugFatalError("needs to be override")
    }
    //顶点v的数据（该顶点的确存在）
    func vertex(at index: Int) -> V {
        debugFatalError("needs to be override")
    }
    //顶点v的入度（该顶点的确存在）
    func inDegree(at index: Int) -> Int {
        debugFatalError("needs to be override")
    }
    //顶点v的出度（该顶点的确存在）
    func outDegree(at index: Int) -> Int {
        debugFatalError("needs to be override")
    }
    //顶点v的首个邻接顶点
    func firstNbr(at index: Int) -> Int {
        debugFatalError("needs to be override")
    }
    //顶点v的（相对于顶点j的）下一邻接顶点
    func nextNbr(at index: Int, relativeTo otherIndex: Int) -> Int {
        debugFatalError("needs to be override")
    }
    //顶点v的状态
    func status(at index: Int) -> VStatus {
        debugFatalError("needs to be override")
    }
    //顶点v的时间标签dTime
    func dTime(at index: Int) -> Int {
        debugFatalError("needs to be override")
    }
    //顶点v的时间标签fTime
    func fTime(at index: Int) -> Int {
        debugFatalError("needs to be override")
    }
    //顶点v在遍历树中的父亲
    func parent(at index: Int) -> Int {
        debugFatalError("needs to be override")
    }
    //顶点v在遍历树中的优先级数
    func priority(at index: Int) -> Int {
        debugFatalError("needs to be override")
    }
    
    /// 边总数
    var e: Int
    //边(v, u)是否存在
    func exists(at index: Int, relativeTo otherIndex: Int) -> Bool {
        debugFatalError("needs to be override")
    }
    //在顶点v和u之间插入权重为w的边e
    func insert(_ d: E, _ w: Int, at index: Int, relativeTo otherIndex: Int) {
        debugFatalError("needs to be override")
    }
    //删除顶点v和u之间的边e，返回该边信息
    func remove(at index: Int, relativeTo otherIndex: Int) -> E {
        debugFatalError("needs to be override")
    }
    //边(v, u)的类型
    func type(at index: Int, relativeTo otherIndex: Int) -> EType {
        debugFatalError("needs to be override")
    }
    //边(v, u)的数据（该边的确存在）
    func edge(at index: Int, relativeTo otherIndex: Int) -> E {
        debugFatalError("needs to be override")
    }
    //边(v, u)的权重
    func weight(at index: Int, relativeTo otherIndex: Int) -> Int {
        debugFatalError("needs to be override")
    }
    
    init() {
        n = 0
        e = 0
    }
}
